home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1998 July / EnigmA AMIGA RUN 29 (1998)(G.R. Edizioni)(IT)[!][issue 1998-07 & 08].iso / earcd / phase5 / ppcrelease / examples / msg6ppc.c < prev    next >
C/C++ Source or Header  |  1998-02-21  |  4KB  |  203 lines

  1. #include <exec/types.h>
  2. #include <exec/nodes.h>
  3. #include <exec/lists.h>
  4. #include <exec/memory.h>
  5. #include <utility/tagitem.h>
  6. #include <powerup/ppclib/interface.h>
  7. #include <powerup/ppclib/message.h>
  8. #include <powerup/ppclib/tasks.h>
  9. #include <powerup/gcclib/powerup_protos.h>
  10.  
  11. #define TEXT    "Text sent by PPC processor\n"
  12. #define    DEBUG    0
  13.  
  14. BPTR        MyFile;
  15. void        printf(char *String);
  16. ULONG        DataArray[10];
  17. char        TextBuffer[500];
  18.  
  19. struct StartupData
  20. {
  21.     void    *MsgPort;
  22.     ULONG    MsgCount;
  23. };
  24.  
  25.  
  26. int    main(void)
  27. {
  28. struct TagItem        MyTags[10];
  29. struct StartupData    *StartupData;
  30. void            *ReplyPort;
  31. void            *M68kPort;
  32. void            *PPCMsg;
  33. void            *Body;
  34. ULONG            result;
  35. ULONG            MsgCount;
  36. ULONG            i;
  37. void            **MsgArray;
  38.  
  39.   StartupData    =(struct StartupData *) PPCGetTaskAttr(PPCTASKTAG_STARTUP_MSGDATA);
  40.   MsgCount    =    StartupData->MsgCount;
  41.  
  42. #if DEBUG
  43.   if (MyFile = PPCOpen("con:0/0/640/200/MessageDemo - PPC output/CLOSE", MODE_NEWFILE))
  44.   {
  45. #endif
  46.     if (MsgArray=(void**) PPCAllocVec(sizeof(void*) * MsgCount, MEMF_PUBLIC))
  47.     {
  48.       if (M68kPort=StartupData->MsgPort)
  49.       {
  50. #if DEBUG
  51.         printf("Allocating memory for message body\n");
  52. #endif
  53.         if (Body = PPCAllocVec(sizeof(TEXT), MEMF_PUBLIC))
  54.         {
  55. #if DEBUG
  56.           printf("Creating reply port\n");
  57. #endif
  58.           MyTags[0].ti_Tag = TAG_DONE;
  59.           if (ReplyPort = PPCCreatePort(MyTags))
  60.           {
  61. #if DEBUG
  62.             printf("Create 1000 Messages...");
  63. #endif
  64.  
  65.             for (i=0;i<MsgCount;i++)
  66.             {
  67.               if ((MsgArray[i]=PPCCreateMessage(ReplyPort,
  68.                                                 sizeof(TEXT)))==NULL)
  69.               {
  70.                 break;
  71.               }
  72.             }
  73.  
  74. #if DEBUG
  75.             printf("done\n");
  76. #endif
  77.  
  78.             if (i>=MsgCount)
  79.             {
  80. #if DEBUG
  81.               printf("Sending 1000 Messages...");
  82. #endif
  83.               strcpy(Body, TEXT);
  84.  
  85.               for (i=0;i<MsgCount;i++)
  86.               {
  87.                 PPCSendMessage(M68kPort,
  88.                                MsgArray[i],
  89.                                Body,
  90.                                sizeof(TEXT),
  91.                                i);
  92.               }
  93.  
  94. #if DEBUG
  95.               printf("done\n");
  96. #endif
  97.  
  98. #if DEBUG
  99.               printf("Waiting for 1000 Replies...");
  100. #endif
  101.  
  102.               i    =    0;
  103.  
  104.               while (i<MsgCount)
  105.               {
  106.                 PPCWaitPort(ReplyPort);
  107.                 while (i<MsgCount && (PPCMsg=PPCGetMessage(ReplyPort)))
  108.                 {
  109. #if DEBUG1
  110.                   DataArray[0]    =    PPCMsg;
  111.                   DataArray[1]    =    PPCGetMessageAttr(PPCMsg, PPCMSGTAG_MSGID);
  112.                   DataArray[2]    =    i;
  113.  
  114.                   PPCRawDoFmt("Msg 0x%lx(%ld) %ld\n",
  115.                               &DataArray,
  116.                               0,                /* 0=Buffer,1=serial,? NOT supported yet */
  117.                               &TextBuffer);
  118.  
  119.                   PPCWrite(MyFile,
  120.                            &TextBuffer,
  121.                            strlen(&TextBuffer));
  122.  
  123. #endif
  124.  
  125.                   i++;
  126.                 }
  127. *((ULONG*)0xfff01040)    =    i;
  128.               }
  129.  
  130. #if DEBUG
  131.               printf("done\n");
  132. #endif
  133.  
  134. #if DEBUG
  135.               printf("Deleting messages...\n");
  136. #endif
  137.               for (i=0;i<MsgCount;i++)
  138.               {
  139.                 if (MsgArray[i])
  140.                 {
  141.                   PPCDeleteMessage(MsgArray[i]);
  142.                 }
  143.               }
  144.             }
  145.             else
  146.             {
  147. #if DEBUG
  148.               printf("Could not create ppc msg\n");
  149. #endif
  150.             }
  151.  
  152. #if DEBUG
  153.             printf("Deleting reply port\n");
  154. #endif
  155.             while (PPCDeletePort(ReplyPort) == FALSE);
  156.           }
  157.           else
  158.           {
  159. #if DEBUG
  160.             printf("Could not create reply port\n");
  161. #endif
  162.           }
  163.  
  164. #if DEBUG
  165.           printf("Freeing message body memory\n");
  166. #endif
  167.           PPCFreeVec(Body);
  168.         }
  169.         else
  170.         {
  171. #if DEBUG
  172.           printf("Could not alloc mem for msg body\n");
  173. #endif
  174.         }
  175.       }
  176.       else
  177.       {
  178. #if DEBUG
  179.         printf("Could not get a M68k msgport\n");
  180. #endif
  181.       }
  182.       PPCFreeVec(MsgArray);
  183.     }
  184.     else
  185.     {
  186. #if DEBUG
  187.       printf("Could not alloc mem for msg array\n");
  188. #endif
  189.     }
  190.  
  191. #if DEBUG
  192.     printf("Closing output\n");
  193.     PPCClose(MyFile);
  194.   }
  195. #endif
  196. }
  197.  
  198. void    printf(char *String)
  199. {
  200.   PPCWrite(MyFile, String, strlen(String));
  201. }
  202.  
  203.